package com.testing.webPO;

import com.testing.common.AutoTools;
import com.testing.common.ExcelReader;
import com.testing.common.ExcelWriter;
import com.testing.web.WebKeyword;
import io.qameta.allure.Allure;
import org.testng.annotations.*;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static org.testng.Assert.assertTrue;


/**
 * @Classname WebExcelDriven
 * @Description TestNG集成web自动化数据驱动的操作，
 * 并且通过引入重写后的allure监听，
 * 加入执行错误后将截图保存到allure中的功能
 * @Date 2021/7/8 22:34
 * @Created by 特斯汀Roy
 */
@Listeners({AllureListener.class})
public class WebExcelDriven {
	public WebKeyword web;
	public ExcelReader caseExcel;
	public ExcelWriter resultExcel;
	public String createdate;
	public String rootpath;

	//完成excel文件的读取和关键字类的实例化
	@BeforeSuite
	public void beforeSuite() {
		//获取当前的执行时间
		Date date = new Date();
		//将时间以设定的标准格式转存为一个字符串
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HH-mm-ss");
		createdate = sdf.format(date);
		//指定文件路径打开excel用例文件，并且拷贝一份结果文件用于记录执行结果
		rootpath = System.getProperty("user.dir");
		caseExcel = new ExcelReader(rootpath+"\\Cases\\TestNGWebCases.xlsx");
		resultExcel = new ExcelWriter(rootpath+"\\Cases\\TestNGWebCases.xlsx", rootpath+"\\Cases\\Result\\result-"+createdate+"TestNGWebCases");
		web =new WebKeyword(resultExcel);
	}

//通过数据指定的关键字运行，并且断言
  @Test(dataProvider = "keywords")
  public void webTest(String rowNo, String kong,String casename,String keywords,String param1,String param2,String param3,String k1,String k2,String k3,String k4 ) {
	  //读取excel返回的内容中的行数，作为当前正在操作的行
	  int No=0;
	  No=Integer.parseInt(rowNo);
	  web.setWriteLine(No);
	  //行数和用例名称输出
	  System.out.println(rowNo+casename);

	  List<String> keywordList=new ArrayList<>();
	  keywordList.add(keywords);
	  keywordList.add(param1);
	  keywordList.add(param2);
	  keywordList.add(param3);

	  //通过java反射机制调用excel文件中指定的关键字方法。
	  boolean runRes= AutoTools.invokeAssert(web,keywordList,0);
	  System.out.println(runRes);
	  Allure.step(casename);
	  Allure.story(casename);
	  Allure.feature(rowNo+casename);
	  
	  //通过testng的断言机制来判断用例执行的结果是否是通过的。
	  assertTrue(runRes);
  }

  //读数据
  @DataProvider
  public Object[][] keywords() {
	  return caseExcel.readAsMatrix();
  }
  

  //清理测试环境，保存excel结果，关闭excel在内存中的对象。
  @AfterSuite
  public void afterSuite() {
	  caseExcel.close();
	  resultExcel.save();
  }

}
